#include <iostream>
using namespace std;
// 定义二叉树节点
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;

    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

// 辅助函数：递归判断二叉树是否是二叉查找树
bool isBSTHelper(TreeNode* node, long long minVal, long long maxVal) {
    if (node == nullptr) {
        return true; // 空树是二叉查找树
    }

    // 检查当前节点值是否在合法范围内
    if (node->val <= minVal || node->val >= maxVal) {
        return false;
    }

    // 递归检查左子树和右子树
    return isBSTHelper(node->left, minVal, node->val) &&
           isBSTHelper(node->right, node->val, maxVal);
}

// 主函数：判断二叉树是否是二叉查找树
bool isBST(TreeNode* root) {
    return isBSTHelper(root, LLONG_MIN, LLONG_MAX);
}